home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-ROM Collection / Amiga CD-ROM Collection - Auge 4000 and Cactus and Demo Util.iso / auge4000 / 46 / lib / memory / movmem.a < prev    next >
Text File  |  1990-06-20  |  3KB  |  118 lines

  1.  
  2.         ;   MOVMEM.A
  3.         ;
  4.         ;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  5.  
  6.         section text,code
  7.  
  8.         ;   movmem(src, dst, len)   (ANSI)
  9.         ;   bcopy(src, dst, len)    (UNIX)
  10.         ;        D0    D1   A0
  11.         ;     4(sp) 8(sp) 12(sp)
  12.         ;
  13.         ;   The memory move algorithm is somewhat more of a mess
  14.         ;   since we must do it either ascending or decending.
  15.  
  16.         xdef    _movmem
  17.         xdef    _bcopy        ; UNIX
  18.  
  19. _bcopy:
  20. _movmem:    move.l    4(sp),A0
  21.         move.l    8(sp),A1
  22.         move.l    12(sp),D0
  23.  
  24.         cmp.l    A0,A1        ;move to self
  25.         beq    xbmend
  26.         bls    xbmup
  27. xbmdown     adda.l    D0,A0        ;descending copy
  28.         adda.l    D0,A1
  29.         move.w    A0,D1        ;CHECK WORD ALIGNED
  30.         lsr.l    #1,D1
  31.         bcs    xbmdown1
  32.         move.w    A1,D1
  33.         lsr.l    #1,D1
  34.         bcs    xbmdown1
  35.         cmp.l    #259,D0         ;chosen by calculation.
  36.         bcs    xbmdown8
  37.  
  38.         move.l    D0,D1            ;overhead for bmd44: ~360
  39.         divu    #44,D1
  40.         bvs    xbmdown8        ;too big (> 2,883,540)
  41.         movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  42.         move.l    #44,D0
  43.         bra    xbmd44b
  44. xbmd44a     sub.l    D0,A0            ;8        total 214/44bytes
  45.         movem.l (A0),D2-D7/A2-A6    ;12 + 8*11  4.86 cycles/byte
  46.         movem.l D2-D7/A2-A6,-(A1)   ; 8 + 8*11
  47. xbmd44b     dbf    D1,xbmd44a        ;10
  48.         swap    D1            ;D0<15:7> already contain 0
  49.         move.w    D1,D0            ;D0 = remainder
  50.         movem.l (sp)+,D2-D7/A2-A6
  51.  
  52. xbmdown8    move.w    D0,D1            ;D1<2:0> = #bytes left later
  53.         lsr.l    #3,D0            ;divide by 8
  54.         bra    xbmd8b
  55. xbmd8a        move.l    -(A0),-(A1)         ;20         total 50/8bytes
  56.         move.l    -(A0),-(A1)         ;20         = 6.25 cycles/byte
  57. xbmd8b        dbf    D0,xbmd8a        ;10
  58.         sub.l    #$10000,D0
  59.         bcc    xbmd8a
  60.         move.w    D1,D0            ;D0 = 0 to 7 bytes
  61.         and.l    #7,D0
  62.         bne    xbmdown1
  63. xbmend        rts
  64.  
  65. xbmd1a        move.b    -(A0),-(A1)         ;12         total 22/byte
  66. xbmdown1                    ;        = 22 cycles/byte
  67. xbmd1b        dbf    D0,xbmd1a        ;10
  68.         sub.l    #$10000,D0
  69.         bcc    xbmd1a
  70.         rts
  71.  
  72. xbmup        move.w    A0,D1            ;CHECK WORD ALIGNED
  73.         lsr.l    #1,D1
  74.         bcs    xbmup1
  75.         move.w    A1,D1
  76.         lsr.l    #1,D1
  77.         bcs    xbmup1
  78.         cmp.l    #259,D0         ;chosen by calculation
  79.         bcs    xbmup8
  80.  
  81.         move.l    D0,D1            ;overhead for bmu44: ~360
  82.         divu    #44,D1
  83.         bvs    xbmup8            ;too big (> 2,883,540)
  84.         movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  85.         move.l    #44,D0
  86.         bra    xbmu44b
  87. xbmu44a     movem.l (A0)+,D2-D7/A2-A6   ;12 + 8*11  ttl 214/44bytes
  88.         movem.l D2-D7/A2-A6,(A1)    ;8  + 8*11  4.86 cycles/byte
  89.         add.l    D0,A1            ;8
  90. xbmu44b     dbf    D1,xbmu44a        ;10
  91.         swap    D1            ;D0<15:7> already contain 0
  92.         move.w    D1,D0            ;D0 = remainder
  93.         movem.l (sp)+,D2-D7/A2-A6
  94.  
  95. xbmup8        move.w    D0,D1            ;D1<2:0> = #bytes left later
  96.         lsr.l    #3,D0            ;divide by 8
  97.         bra    xbmu8b
  98. xbmu8a        move.l    (A0)+,(A1)+         ;20         total 50/8bytes
  99.         move.l    (A0)+,(A1)+         ;20         = 6.25 cycles/byte
  100. xbmu8b        dbf    D0,xbmu8a        ;10
  101.         sub.l    #$10000,D0
  102.         bcc    xbmu8a
  103.         move.w    D1,D0            ;D0 = 0 to 7 bytes
  104.         and.l    #7,D0
  105.         bne    xbmup1
  106.         rts
  107.  
  108. xbmu1a        move.b    (A0)+,(A1)+
  109. xbmup1
  110. xbmu1b        dbf    D0,xbmu1a
  111.         sub.l    #$10000,D0
  112.         bcc    xbmu1a
  113.         rts
  114.  
  115.         END
  116.  
  117.  
  118.